李守中

Firewalld 笔记

Table of Contents

1. 基础用法

sudo systemctl start firewalld 启动服务。

sudo systemctl enable firewalld 服务开机自启动。

sudo systemctl stop firewalld 停止服务。

sudo systemctl disable firewalld 取消开机自启动。

sudo systemctl status firewalld 查看 firewalld 守护进程的状态。

sudo firewall-cmd --state 检查防火墙状态。输出应该是 running 或者 not running

sudo firewall-cmd --reload 重新加载 firewalld 配置。

2. 配置 firewalld

firewalld 使用 XML 进行配置,配置文件位于两个目录中:

  • /usr/lib/firewalld 下保存默认配置,如默认区域和公用服务。每次 firewall 软件包更新时都会覆盖这些文件,所以不要改这里的文件。
  • /etc/firewalld 下保存系统配置文件。这些文件将覆盖默认配置。自己写的配置文件要放在这里。

3. 配置集

firewalld 使用 runtimepersistent 两个配置集。系统重新启动或 firewalld-cmd --reload 时,不会保留 runtime 的配置更改,而对 persistent 配置集的更改不会应用于正在运行的系统。

默认情况下,firewall-cmd 命令适用于 runtime 配置,但在命令后加 --permanent 参数可以将配置保存到 persistent 配置中。要添加和激活 persistent 规则,可以使用下面两种方法之一。

  1. 将规则同时添加到 runtime 和 persistent 规则集中:
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=http
  1. 将规则添加到 persistent 规则集中并重载 firewalld:
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --reload

--reload 命令会删除所有 runtime 配置并应用 persistent 配置。又因为 firewalld 动态管理规则集,所以它不会破坏现有的连接和会话。

4. 防火墙的 zone

zone ( 区域 ) 是针对给定位置或场景 ( 例如家庭、公共、受信任等 ) 可能具有的各种信任级别的预构建规则集。不同的 zone 允许不同的网络服务和入站流量类型,而拒绝其他任何流量。首次启用 firewalld 后, public 将是默认 zone。

zone 也可以用于不同的网络接口。例如,要分离内部网络和互联网的接口,你可以在 internal zone 上允许 DHCP,但在 external zone 仅允许 HTTP 和 SSH。未明确设置为特定区域的任何接口将添加到默认 ( public ) zone。

sudo firewall-cmd --get-default-zone 会输出默认 zone。

sudo firewall-cmd --set-default-zone=internal 可以修改默认 zone。

sudo firewall-cmd --get-active-zones 查看网络接口使用的 zone。

sudo firewall-cmd --zone=public --list-all 显示特定 zone 的所有配置。

sudo firewall-cmd --list-all-zones 显示所有 zone 的配置。

5. 自定义 service

firewalld 可以根据特定网络 service 的预定义规则来允许相关流量。用户可以创建自己的系统规则,并将它们添加到任何 zone。默认支持的 service 的配置文件位于 /usr/lib/firewalld/services,用户创建的服务文件要被放在 /etc/firewalld/services 中。

sudo firewall-cmd --get-services 查看默认的可用 service。

sudo firewall-cmd --zone=public --add-service=http --permanent 启用名为 http 的服务。

sudo firewall-cmd --zone=public --remove-service=http --permanent 禁用名为 http 的服务。

6. 允许或者拒绝某个端口 / 协议

sudo firewall-cmd --list-ports 显示目前已经被允许连接的端口及对应协议。

sudo firewall-cmd --zone=public --add-port=12345/tcp --permanent 允许 12345 端口的 TCP 流量。

sudo firewall-cmd --zone=public --add-port=12345/udp --permanent 允许 12345 端口的 UDP 流量。

sudo firewall-cmd --zone=public --remove-port=12345/tcp --permanent 禁用 12345 端口的 TCP 流量。

sudo firewall-cmd --zone=public --remove-port=12345/udp --permanent 禁用 12345 端口的 UDP 流量。

7. 端口转发

将本机 80 端口的流量转发到本机 12345 端口:

sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=12345

将本机流量转发到另外一台服务器上:

  1. 在需要的区域中激活 masquerade:
sudo firewall-cmd --zone=public --add-masquerade
  1. 添加转发规则。比如,将本机 80 端口的流量转发到 IP 地址为 123.456.78.9 的服务器的 8080 端口上。
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=123.456.78.9

删除规则,用 --remove 替换 --add 。比如: sudo firewall-cmd --zone=public --remove-masquerade

8. 用 firewalld 构建规则集

给一个例子,使用 firewalld 构建一个新的 zone 并配置其中的规则:

  1. 将 eth0 的默认区域设置为 dmz。在所提供的默认区域中,dmz ( 非军事区 ) 是最适合于这个程序的,因为它只允许 SSH 和 ICMP。
sudo firewall-cmd --set-default-zone=dmz
sudo firewall-cmd --zone=dmz --add-interface=eth0
  1. 把 HTTP 和 HTTPS 添加永久的服务规则到 dmz 区域中:
sudo firewall-cmd --zone=dmz --add-service=http --permanent
sudo firewall-cmd --zone=dmz --add-service=https --permanent
  1. 重新加载 firewalld 让规则立即生效:
sudo firewall-cmd --reload

如果运行 firewall-cmd --zone=dmz --list-all 会有下面的输出:

dmz (default)
  interfaces: eth0
  sources:
  services: http https ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

输出显示,dmz zone 是默认 zone,它被用于 eth0 接口中所有网络的源地址和端口。允许传入 HTTP ( 端口 80 )、HTTPS ( 端口 443 ) 和 SSH ( 端口 22 ) 的流量,并且由于没有 IP 版本控制的限制,所以 IPv4 和 IPv6 流量都适用于这个 zone。不允许 IP 伪装以及端口转发。我们没有 ICMP 块,所以 ICMP 流量是完全允许的。没有 Rich rules,意思是允许所有出站流量。



Last Update: 2023-05-18 Thu 11:02

Generated by: Emacs 28.2 (Org mode 9.5.5)   Contact: [email protected]

若正文中无特殊说明,本站内容遵循: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议